# Compiler
CC=g++
CFLAGS=-c -ggdb -ansi -I. -Imodules/
CFLAGS2=-ggdb -ansi
# Linker
LD=g++
LFLAGS=-ggdb -O2
# Bison, re2c
BISON=bison
RE2C=re2c

OBJECTS=parser.o scanner.o driver.o compiler.o vm.o main.o types.o numeric.o str.o bool.o int.o double.o object.o API.o opcodes.o vector.o map.o internal.o modules/module.o modules/std/core.o
#OBJECTS=parser.o scanner.o driver.o compiler.o vm.o main.o types.o string.o bool.o int.o double.o object.o API.o opcodes.o vector.o map.o internal.o modules/module.o modules/std/core.o

todo: $(OBJECTS)
	$(LD) $(LFLAGS) -o todo $(OBJECTS)

all: todo test

driver.o: driver.cpp parser.o
	$(CC) $(CFLAGS) -o driver.o driver.cpp

types.o: types.cpp
	$(CC) $(CFLAGS) -o types.o types.cpp
	
str.o: str.cpp
	$(CC) $(CFLAGS) -o str.o str.cpp
	
bool.o: bool.cpp
	$(CC) $(CFLAGS) -o bool.o bool.cpp

int.o: int.cpp
	$(CC) $(CFLAGS) -o int.o int.cpp
	
double.o: double.cpp
	$(CC) $(CFLAGS) -o double.o double.cpp
	
numeric.o: numeric.cpp
	$(CC) $(CFLAGS) -o numeric.o numeric.cpp

object.o: object.cpp
	$(CC) $(CFLAGS) -o object.o object.cpp

vector.o: vector.cpp
	$(CC) $(CFLAGS) -o vector.o vector.cpp
	
map.o: map.cpp
	$(CC) $(CFLAGS) -o map.o map.cpp
	
compiler.o: compiler.cpp parser.o
	$(CC) $(CFLAGS) -o compiler.o compiler.cpp

main.o: main.cpp
	$(CC) $(CFLAGS) -o main.o main.cpp

API.o: API.cpp
	$(CC) $(CFLAGS) -o API.o API.cpp
	
internal.o: internal.cpp
	$(CC) $(CFLAGS) -o internal.o internal.cpp
	
modules/module.o: modules/module.cpp
	$(CC) $(CFLAGS) -o modules/module.o modules/module.cpp

modules/std/core.o: modules/module.o modules/std/core.cpp
	$(CC) $(CFLAGS) -o modules/std/core.o modules/std/core.cpp

vm.o: vm.cpp
	$(CC) $(CFLAGS) -o vm.o vm.cpp
	
opcodes.o: opcodes.cpp
	$(CC) $(CFLAGS) -o opcodes.o opcodes.cpp

parser.cpp: parser.y
	$(BISON) -d -oparser.cpp parser.y
	
parser.o: parser.cpp
	$(CC) $(CFLAGS) -o parser.o parser.cpp
 
scanner.o: scanner.re parser.o
	$(RE2C) --case-insensitive -b -c -o scanner.cpp scanner.re
	$(CC) $(CFLAGS) -o scanner.o scanner.cpp

test: testrunner.cpp
	$(CC) $(CFLAGS2) -otestrunner testrunner.cpp -lpcrecpp
	
tests: todo test
	./testrunner tests/

clean:
	rm -f todo testrunner scanner.cpp parser.cpp parser.output *.o modules/*.o modules/std/*.o parser.hpp stack.hh position.hh location.hh scanner_defs.h

clean-tests:
	rm -rf tests/*.log tests/*.mem
	
clean-all: clean clean-tests
